x11: Store toplevel list in GdkDisplay
authorMatthias Clasen <mclasen@redhat.com>
Mon, 13 Nov 2017 21:32:34 +0000 (16:32 -0500)
committerMatthias Clasen <mclasen@redhat.com>
Mon, 13 Nov 2017 21:32:34 +0000 (16:32 -0500)
This will let us get rid of the root window.

gdk/x11/gdkdevice-core-x11.c
gdk/x11/gdkdevice-xi2.c
gdk/x11/gdkdisplay-x11.c
gdk/x11/gdkdisplay-x11.h
gdk/x11/gdkdnd-x11.c
gdk/x11/gdkmonitor-x11.c
gdk/x11/gdkscreen-x11.c
gdk/x11/gdkxid.c

index 6176f6ca0548db81a5a6cd5823e8e5aeba8a9692..b166ba83f0f05cffc05ad56d0f420c8cc059989b 100644 (file)
@@ -523,8 +523,6 @@ gdk_x11_device_core_window_at_position (GdkDevice       *device,
             }
         }
 
-      g_list_free (toplevels);
-
       xwindow = pointer_window;
     }
 
index 210c72bb108e4050e7f088c291e722577465d636..733b652bb2754a631f405b4987a31d9681c24bff 100644 (file)
@@ -606,7 +606,6 @@ gdk_x11_device_xi2_window_at_position (GdkDevice       *device,
                 }
             }
 
-          g_list_free (toplevels);
           if (pointer_window != None)
             break;
         }
index a9f4e2eb939663119232cb646542d97aba5a90be..a165917940bde0e9296967b4262e2442ef837be0 100644 (file)
@@ -3160,23 +3160,7 @@ gdk_x11_display_get_root_window (GdkDisplay *display)
 GList *
 gdk_x11_display_get_toplevel_windows (GdkDisplay *display)
 {
-  GdkWindow * root_window;
-  GList *new_list = NULL;
-  GList *tmp_list;
-
-  root_window = gdk_x11_display_get_root_window (display);
-
-  tmp_list = root_window->children;
-  while (tmp_list)
-    {
-      GdkWindow *w = tmp_list->data;
-
-      if (w->window_type != GDK_WINDOW_FOREIGN)
-        new_list = g_list_prepend (new_list, w);
-      tmp_list = tmp_list->next;
-    }
-
-  return new_list;
+  return GDK_X11_DISPLAY (display)->toplevels;
 }
 
 static void
index 87b5f7f5edf6db636bf855cb1e8ad04cb7557da3..3ddc7773b748c4942aab260242f7b08e116bc2a9 100644 (file)
@@ -40,6 +40,7 @@ struct _GdkX11Display
   Display *xdisplay;
   GdkScreen *screen;
   GList *screens;
+  GList *toplevels;
 
   GSource *event_source;
 
index 71e8c295747915a591ac49b624c02d4214be10b6..fc6ea6964c1e8d71cc9718ff2dd200269bdeb384 100644 (file)
@@ -600,7 +600,6 @@ gdk_window_cache_new (GdkDisplay *display)
                                height * impl->window_scale,
                                 gdk_window_is_visible (window));
         }
-      g_list_free (toplevel_windows);
       return result;
     }
 
index 8cfddfe170b2ebe17e9261573731f776d2801149..9de9060198f7f1b0288e1237546c826a4009f8aa 100644 (file)
@@ -55,8 +55,6 @@ gdk_monitor_has_fullscreen_window (GdkMonitor *monitor)
         }
     }
 
-  g_list_free (toplevels);
-
   return has_fullscreen;
 }
 
index e5c0f2c2ed5fcbea388af1788d23503d10db24ce..c16107e178871f0d475fbe36bb4f557be95c9211 100644 (file)
@@ -840,8 +840,6 @@ _gdk_x11_screen_set_window_scale (GdkX11Screen *x11_screen,
       _gdk_x11_window_set_window_scale (window, scale);
     }
 
-  g_list_free (toplevels);
-
   for (i = 0; i < x11_display->monitors->len; i++)
     {
       GdkMonitor *monitor = GDK_MONITOR (x11_display->monitors->pdata[i]);
index 8302e74b4e118a24ae229d883fc1beef76928b22..1a8171ed45612404d532dffa0ea15033a5612975 100644 (file)
@@ -61,6 +61,9 @@ _gdk_x11_display_add_window (GdkDisplay *display,
     g_warning ("XID collision, trouble ahead");
 
   g_hash_table_insert (display_x11->xid_ht, xid, data);
+
+  if (gdk_window_get_parent (GDK_WINDOW (data)) == NULL)
+    display_x11->toplevels = g_list_prepend (display_x11->toplevels, data);
 }
 
 void
@@ -68,13 +71,20 @@ _gdk_x11_display_remove_window (GdkDisplay *display,
                                 XID         xid)
 {
   GdkX11Display *display_x11;
+  GdkWindow *window;
 
   g_return_if_fail (GDK_IS_DISPLAY (display));
 
   display_x11 = GDK_X11_DISPLAY (display);
 
-  if (display_x11->xid_ht)
-    g_hash_table_remove (display_x11->xid_ht, &xid);
+  if (!display_x11->xid_ht)
+    return;
+
+  window = g_hash_table_lookup (display_x11->xid_ht, &xid);
+  if (window && gdk_window_get_parent (window) == NULL)
+    display_x11->toplevels = g_list_remove (display_x11->toplevels, window);
+
+  g_hash_table_remove (display_x11->xid_ht, &xid);
 }
 
 /**